package com.zm.blog.enums;

import java.util.Arrays;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * 评论类型枚举
 */
public enum CommentTypeEnum {

    COMMENT_TYPE_ARTICLE("article", "文章评论"),
    COMMENT_TYPE_MESSAGE("message", "树洞留言"),
    COMMENT_TYPE_LOVE("love", "表白墙留言");

    private final String code;
    private final String desc;

//    CommentTypeEnum(String code, String desc) {
//        this.code = code;
//        this.desc = desc;
//    }
//
//    public String getCode() {
//        return code;
//    }
//
//    public String getDesc() {
//        return desc;
//    }
//
//    public static CommentTypeEnum getEnumByCode(String code) {
//        if (StringUtils.hasText(code)) {
//            CommentTypeEnum[] values = CommentTypeEnum.values();
//            for (CommentTypeEnum typeEnum : values) {
//                if (typeEnum.getCode().equalsIgnoreCase(code)) {
//                    return typeEnum;
//                }
//            }
//        }
//        return null;
//    }
//
//    public static CommentTypeEnum getEnumByDesc(String desc) {
//        if (StringUtils.hasText(desc)) {
//            CommentTypeEnum[] values = CommentTypeEnum.values();
//            for (CommentTypeEnum typeEnum : values) {
//                if (typeEnum.getDesc().equalsIgnoreCase(desc)) {
//                    return typeEnum;
//                }
//            }
//        }
//        return null;
//    }
//
//    public static Map<String, String> getEnumMap() {
//        return Arrays.stream(CommentTypeEnum.values()).collect(Collectors.toMap(CommentTypeEnum::getCode, CommentTypeEnum::getDesc));
//    }

    // 缓存映射提升性能
    private static final Map<String, CommentTypeEnum> CODE_TO_ENUM;
    private static final Map<String, CommentTypeEnum> DESC_TO_ENUM;

     CommentTypeEnum(String code, String desc) {
         this.code = code;
         this.desc = desc;
     }

     public String getCode() {
         return code;
     }

     public String getDesc() {
         return desc;
     }

     static {
         CODE_TO_ENUM = Arrays.stream(values())
                 .collect(Collectors.toMap(
                         e -> e.code.toLowerCase(),  // 统一小写作为键
                         e -> e,
                         (existing, replacement) -> existing));

         DESC_TO_ENUM = Arrays.stream(values())
                 .collect(Collectors.toMap(
                         e -> e.desc.toLowerCase(),  // 统一小写作为键
                         e -> e,
                         (existing, replacement) -> existing));
     }

     //使用 Optional 的安全查询方法
     public static Optional<CommentTypeEnum> getEnumByCode(String code) {
         return Optional.ofNullable(code).
                 filter(c -> !c.trim().isEmpty())
                 .map(c -> CODE_TO_ENUM.get(c.toLowerCase()));
     }

    public static Optional<CommentTypeEnum> getEnumByDesc(String desc) {
        return Optional.ofNullable(desc)
                .filter(d -> !d.trim().isEmpty())
                .map(d -> DESC_TO_ENUM.get(d.toLowerCase()));
    }

    //兼顾旧代码的null返回方法
    public static CommentTypeEnum findEnumByCode(String code) {
         return getEnumByCode(code).orElse(null);
    }

    public static CommentTypeEnum findEnumByDesc(String desc) {
         return getEnumByDesc(desc).orElse(null);
    }

    //获取映射关系
    public static Map<String, String> getEnumMap() {
         return Arrays.stream(values())
                 .collect(Collectors.toMap(
                         CommentTypeEnum::getCode,
                         CommentTypeEnum::getDesc
                 ));
    }

}
